import { Button, Col, Dropdown, Input, Row, Select } from "antd"; import { UserReadPrivateResponse } from "@newstackdev/iosdk-newgraph-client-js"; import { Link } from "react-router-dom"; import { NLView } from "../../types"; import { Searchicon } from "../../Components/Icons/Searchicon"; import { UsersList } from "../../Components/UserWidget"; import { json } from "overmind"; import { uniqBy } from "lodash"; import { useActions, useAppState } from "../../overmind"; import { useEffect, useState } from "react"; import OutsideClickHandler from "react-outside-click-handler"; export const UserSearchResultsWidget: NLView<{ query: string }> = ({ query }) => { const state = useAppState(); const actions = useActions(); const res = state.lists.search.users.results; useEffect(() => { actions.lists.searchUsers({ query }); }, [query]); return ( ); }; export const TagsAutosuggestWidget: NLView<{ query: string }> = ({ query }) => { const state = useAppState(); const actions = useActions(); const res = uniqBy(json(state.lists.search.tags.results)?.value || [], (t: any) => t.tag); useEffect(() => { actions.lists.searchTags({ query }); }, [query]); return (
{res.length ? res.map((t: any) => (
actions.routing.historyPush({ location: `/search?tags=${t.tag}`, }) } > {t.tag}
)) : res && !res?.length ? "No results" : ""}
); }; type SearchResultsWidget = typeof UserSearchResultsWidget; const SearchResultsByMode = { "@": UserSearchResultsWidget, "#": TagsAutosuggestWidget, }; export const SearchWidget: NLView<{ user?: UserReadPrivateResponse; // search: boolean; // setSearch: React.Dispatch>; }> = ({ user }) => { const state = useAppState(); const [query, setQuery] = useState(""); const [mode, setMode] = useState("#"); const [resultsVisible, setResultsVisible] = useState(false); const [SearchResultsWidget, setSearchResultsWidget] = useState<{ component: SearchResultsWidget; }>({ component: TagsAutosuggestWidget }); const actions = useActions(); const currQuery = mode == "#" ? state.lists.search.posts.query : state.lists.search.users.query; // const setQuery = mode == "#" ? actions.lists.searchTags : actions.lists.searchUsers; const [search, setSearch] = useState(false); useEffect(() => { if (/^[\@\#]$/.test(query)) { setMode(query); setSearchResultsWidget({ component: SearchResultsByMode[query] }); setQuery(""); return; } // if(query.startsWith("#") && query.length > 3) // actions.lists.searchTags({ query }); }, [query]); useEffect(() => { if (currQuery == query) return; setQuery(currQuery); setResultsVisible(false); }, [currQuery]); return (
setSearch(!search)}>
{ setResultsVisible(false); }} > {search && ( } > { const q = query; // setQuery(""); // actions.lists.searchPosts({ tags: q, force: true }); if (mode == "#") { setTimeout( () => actions.routing.historyPush({ location: `/search?tags=${q}`, }), 100, ); setResultsVisible(false); } }} suffix={ search && (
setSearch(false)} style={{ position: "absolute", right: 0, color: "white", // top: "20px", fontSize: "15px", }} > Cancel
) } onFocus={() => setResultsVisible(true)} onChange={(e) => { if (e.target.value == "#") { actions.routing.historyPush({ location: "/search", }); setSearch(false); } else setQuery(e.target.value); setResultsVisible(!!e.target.value); }} style={ query === "" ? { opacity: "80%", width: "100%", } : { opacity: "100%", width: "100%", } } value={query} />
)}
); };